package com.spring.demo4.factory.pointcut;

import java.lang.reflect.Method;

/**
 * 用来过滤方法的
 * <br>
 * 过滤的整个过程：
 * 1.调用matches(Method method, Class<?> targetClass)方法，验证方法是否匹配
 * 2.isRuntime方法是否为true，如果为false，则以第一步的结果为准，否则继续向下
 * 3.调用matches(Method method, Class<?> targetClass, Object... args)方法继续验证，这个方法多了一个参数，可以对目标方法传入的参数进行校验
 *
 * @author vhans
 */
public interface MyMethodMatcher {
    /**
     * 执行静态检查给定方法是否匹配
     *
     * @param method      目标方法
     * @param targetClass 模板对象类型
     */
    boolean matches(Method method, Class<?> targetClass);

    /**
     * 是否是动态匹配，即是否每次执行目标方法的时候都去验证一下
     */
    boolean isRunTime();

    /**
     * 动态匹配验证的方法，比第一个matches方法多了一个参数args，这个参数是调用目标方法传入的参数
     */
    boolean matches(Method method, Class<?> targetClass, Object... args);

    /**
     * 匹配所有方法，这个内部的2个matches方法任何时候都返回true
     */
//     MyMethodMatcher TRUE = TrueMethodMatcher.INSTANCE;
}
